﻿using System.Collections.Generic;
using System.Linq;
using ChampionsLeagueBets.Domain;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.Linq;
using SharpArch.NHibernate;

namespace ChampionsLeagueBets.Infrastructure
{
	public class ExRepository<T> : NHibernateRepository<T>, IExRepository<T>
	{
		/// <summary>
		/// Implementacja Soft Delete
		/// </summary>
		/// <param name="entity">encja, która ma być usunięta</param>
		/// <returns>Rezultat akcji</returns>
		public override void Delete(T entity)
		{
			var baseEntity = entity as BaseEntity;

			if (baseEntity != null)
			{
				baseEntity.IsDeleted = true;
			}
		}

		/// <summary>
		/// Parametryzowanie metody pobierania wszystkich elementów
		/// </summary>
		/// <param name="deleted">true - pobierz wszystkie, false - pobierz wszystkie nieusunięte</param>
		/// <returns>Ilist pobranych elementów</returns>
		public IList<T> GetAll(bool deleted)
		{
			if (!deleted)
			{
				//pokaż nieusunięte
				ICriteria criteria = Session.CreateCriteria(typeof(T));
				criteria.Add(Restrictions.Eq("IsDeleted", false));
				return criteria.List<T>();
			}

			//pokaż wszystkie
			return base.GetAll();
		}

		/// <summary>
		/// Pobiera wszystkie elementy
		/// </summary>
		/// <returns></returns>
		public override IList<T> GetAll()
		{
			return GetAll(false);
		}

		/// <summary>
		/// Metoda pobiera obiekt IQueryable do wykorzystania w Gridzie w celu filtrowania, stronicowania i sortowania
		/// </summary>
		/// <returns>Obiekt IQueryable</returns>
		public IQueryable<T> GetQuery()
		{
			return Session.Query<T>();
		}

		/// <summary>
		/// Liczba wierszy
		/// </summary>
		/// <returns></returns>
		public int GetRowCount()
		{
			return Session.Query<T>().Count();
		}
	}
}
